ã«ã¹ã¿ã ããã¯ã䜿çšããReactã§ã®éåæãªãœãŒã¹æ¶è²»ã®ç®¡çã«ã€ããŠæ·±ãæãäžããã°ããŒãã«ã¢ããªã±ãŒã·ã§ã³åãã®ãã¹ããã©ã¯ãã£ã¹ããšã©ãŒãã³ããªã³ã°ãããã©ãŒãã³ã¹æé©åã解説ããŸãã
Reactã®useããã¯ïŒéåæãªãœãŒã¹æ¶è²»ããã¹ã¿ãŒãã
Reactããã¯ã¯ã颿°ã³ã³ããŒãã³ãã§ã®ç¶æ
管çãšå¯äœçšã®æ±ãã«é©åœããããããŸããããã®äžã§ãç¹ã«åŒ·åãªçµã¿åããã®äžã€ããuseEffectãšuseStateã䜿çšããŠAPIããã®ããŒã¿ååŸãªã©ã®éåæãªãœãŒã¹æ¶è²»ãåŠçããããšã§ãããã®èšäºã§ã¯ãéåææäœã«ããã¯ã䜿çšããéã®è€éãªåŽé¢ãæ·±ãæãäžããå
ç¢ã§ã°ããŒãã«ã«ã¢ã¯ã»ã¹å¯èœãªReactã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ããããã®ãã¹ããã©ã¯ãã£ã¹ããšã©ãŒãã³ããªã³ã°ãããã©ãŒãã³ã¹æé©åã«ã€ããŠè§£èª¬ããŸãã
åºæ¬ãçè§£ããïŒuseEffectãšuseState
ããè€éãªã·ããªãªã«å ¥ãåã«ãé¢äžããåºæ¬çãªããã¯ãå確èªããŸãããïŒ
- useEffect: ãã®ããã¯ã䜿çšãããšã颿°ã³ã³ããŒãã³ãå ã§å¯äœçšãå®è¡ã§ããŸããå¯äœçšã«ã¯ãããŒã¿ååŸããµãã¹ã¯ãªãã·ã§ã³ããŸãã¯DOMã®çŽæ¥æäœãªã©ãå«ãŸããŸãã
- useState: ãã®ããã¯ã䜿çšãããšã颿°ã³ã³ããŒãã³ãã«ç¶æ ã远å ã§ããŸããç¶æ ã¯ãããŒãã£ã³ã°ç¶æ ãAPIããååŸããããŒã¿ãªã©ãæéãšãšãã«å€åããããŒã¿ã管çããããã«äžå¯æ¬ ã§ãã
ããŒã¿ååŸã®å
žåçãªãã¿ãŒã³ã¯ãuseEffectã§éåæãªã¯ãšã¹ããéå§ããuseStateã§ããŒã¿ãããŒãã£ã³ã°ç¶æ
ãããã³æœåšçãªãšã©ãŒãä¿åãããšãããã®ã§ãã
ã·ã³ãã«ãªããŒã¿ååŸã®äŸ
æ¶ç©ºã®APIãããŠãŒã¶ãŒããŒã¿ãååŸããåºæ¬çãªäŸããå§ããŸãããïŒ
äŸïŒãŠãŒã¶ãŒããŒã¿ã®ååŸ
```javascript import React, { useState, useEffect } from 'react'; function UserProfile({ userId }) { const [user, setUser] = useState(null); const [loading, setLoading] = useState(true); const [error, setError] = useState(null); useEffect(() => { const fetchData = async () => { setLoading(true); setError(null); try { const response = await fetch(`https://api.example.com/users/${userId}`); if (!response.ok) { throw new Error(`HTTPãšã©ãŒïŒã¹ããŒã¿ã¹: ${response.status}`); } const data = await response.json(); setUser(data); } catch (error) { setError(error); } finally { setLoading(false); } }; fetchData(); }, [userId]); if (loading) { return
ãŠãŒã¶ãŒããŒã¿ãèªã¿èŸŒã¿äž...
; } if (error) { returnãšã©ãŒ: {error.message}
; } if (!user) { returnå©çšå¯èœãªãŠãŒã¶ãŒããŒã¿ããããŸããã
; } return ({user.name}
ã¡ãŒã«: {user.email}
å Žæ: {user.location}
ãã®äŸã§ã¯ãuserId propã倿Žããããã³ã«useEffectããŠãŒã¶ãŒããŒã¿ãååŸããŸããfetch APIã®éåææ§ãåŠçããããã«async颿°ã䜿çšããŠããŸãããŸããã³ã³ããŒãã³ãã¯ããŒãã£ã³ã°ãšãšã©ãŒã®ç¶æ
ã管çããããè¯ããŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ãæäŸããŸãã
ããŒãã£ã³ã°ãšãšã©ãŒç¶æ ã®åŠç
èªã¿èŸŒã¿äžã«èŠèŠçãªãã£ãŒãããã¯ãæäŸãããšã©ãŒãé©åã«åŠçããããšã¯ãè¯ããŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ã®ããã«éåžžã«éèŠã§ããåã®äŸã§ã¯ãåºæ¬çãªããŒãã£ã³ã°ãšãšã©ãŒãã³ããªã³ã°ããã§ã«ç€ºããŸããããããã®æŠå¿µãããã«æãäžããŠã¿ãŸãããã
ããŒãã£ã³ã°ç¶æ
ããŒãã£ã³ã°ç¶æ ã¯ãããŒã¿ãååŸäžã§ããããšãæç¢ºã«ç€ºãå¿ èŠããããŸããããã¯ãåçŽãªããŒãã£ã³ã°ã¡ãã»ãŒãžããããæŽç·ŽãããããŒãã£ã³ã°ã¹ãããŒã䜿çšããŠå®çŸã§ããŸãã
äŸïŒããŒãã£ã³ã°ã¹ãããŒã®äœ¿çš
åçŽãªããã¹ãã¡ãã»ãŒãžã®ä»£ããã«ãããŒãã£ã³ã°ã¹ãããŒã³ã³ããŒãã³ãã䜿çšããããšãã§ããŸãïŒ
```javascript // LoadingSpinner.js import React from 'react'; function LoadingSpinner() { return
; // å®éã®ã¹ãããŒã³ã³ããŒãã³ãã«çœ®ãæããŠãã ãã } export default LoadingSpinner; ``````javascript
// UserProfile.js (倿ŽåŸ)
import React, { useState, useEffect } from 'react';
import LoadingSpinner from './LoadingSpinner';
function UserProfile({ userId }) {
const [user, setUser] = useState(null);
const [loading, setLoading] = useState(true);
const [error, setError] = useState(null);
useEffect(() => { ... }, [userId]); // 以åãšåãuseEffect
if (loading) {
return
ãšã©ãŒ: {error.message}
; } if (!user) { returnå©çšå¯èœãªãŠãŒã¶ãŒããŒã¿ããããŸããã
; } return ( ... ); // 以åãšåãreturn } export default UserProfile; ```ãšã©ãŒãã³ããªã³ã°
ãšã©ãŒãã³ããªã³ã°ã¯ããŠãŒã¶ãŒã«æçãªã¡ãã»ãŒãžãæäŸããå¯èœã§ããã°ãšã©ãŒããå埩ããæ¹æ³ãæäŸããå¿ èŠããããŸããããã«ã¯ããªã¯ãšã¹ãã®å詊è¡ããµããŒãã®é£çµ¡å ã®æäŸãªã©ãå«ãŸããå ŽåããããŸãã
äŸïŒãŠãŒã¶ãŒãã¬ã³ããªãŒãªãšã©ãŒã¡ãã»ãŒãžã®è¡šç€º
```javascript // UserProfile.js (倿ŽåŸ) import React, { useState, useEffect } from 'react'; function UserProfile({ userId }) { const [user, setUser] = useState(null); const [loading, setLoading] = useState(true); const [error, setError] = useState(null); useEffect(() => { ... }, [userId]); // 以åãšåãuseEffect if (loading) { return
ãŠãŒã¶ãŒããŒã¿ãèªã¿èŸŒã¿äž...
; } if (error) { return (ãŠãŒã¶ãŒããŒã¿ã®ååŸäžã«ãšã©ãŒãçºçããŸããïŒ
{error.message}
å©çšå¯èœãªãŠãŒã¶ãŒããŒã¿ããããŸããã
; } return ( ... ); // 以åãšåãreturn } export default UserProfile; ```åå©çšæ§ã®ããã®ã«ã¹ã¿ã ããã¯ã®äœæ
è€æ°ã®ã³ã³ããŒãã³ãã§åãããŒã¿ååŸããžãã¯ãç¹°ãè¿ããŠããããšã«æ°ã¥ããããã«ã¹ã¿ã ããã¯ãäœæããæã§ããã«ã¹ã¿ã ããã¯ã¯ãã³ãŒãã®åå©çšæ§ãšä¿å®æ§ãåäžãããŸãã
äŸïŒuseFetchããã¯
ããŒã¿ååŸããžãã¯ãã«ãã»ã«åããuseFetchããã¯ãäœæããŸãããïŒ
```javascript // useFetch.js import { useState, useEffect } from 'react'; function useFetch(url) { const [data, setData] = useState(null); const [loading, setLoading] = useState(true); const [error, setError] = useState(null); useEffect(() => { const fetchData = async () => { setLoading(true); setError(null); try { const response = await fetch(url); if (!response.ok) { throw new Error(`HTTPãšã©ãŒïŒã¹ããŒã¿ã¹: ${response.status}`); } const jsonData = await response.json(); setData(jsonData); } catch (error) { setError(error); } finally { setLoading(false); } }; fetchData(); }, [url]); return { data, loading, error }; } export default useFetch; ```
ããã§ãã³ã³ããŒãã³ãã§useFetchããã¯ã䜿çšã§ããŸãïŒ
```javascript // UserProfile.js (倿ŽåŸ) import React from 'react'; import useFetch from './useFetch'; function UserProfile({ userId }) { const { data: user, loading, error } = useFetch(`https://api.example.com/users/${userId}`); if (loading) { return
ãŠãŒã¶ãŒããŒã¿ãèªã¿èŸŒã¿äž...
; } if (error) { returnãšã©ãŒ: {error.message}
; } if (!user) { returnå©çšå¯èœãªãŠãŒã¶ãŒããŒã¿ããããŸããã
; } return ({user.name}
ã¡ãŒã«: {user.email}
å Žæ: {user.location}
useFetchããã¯ã¯ãã³ã³ããŒãã³ãã®ããžãã¯ã倧å¹
ã«ç°¡çŽ åããã¢ããªã±ãŒã·ã§ã³ã®ä»ã®éšåã§ããŒã¿ååŸæ©èœãåå©çšããããããŸããããã¯ã倿°ã®ããŒã¿äŸåé¢ä¿ãæã€è€éãªã¢ããªã±ãŒã·ã§ã³ã§ç¹ã«åœ¹ç«ã¡ãŸãã
ããã©ãŒãã³ã¹ã®æé©å
éåæãªãœãŒã¹æ¶è²»ã¯ãã¢ããªã±ãŒã·ã§ã³ã®ããã©ãŒãã³ã¹ã«åœ±é¿ãäžããå¯èœæ§ããããŸããããã¯ã䜿çšããéã®ããã©ãŒãã³ã¹ãæé©åããããã®ããã€ãã®æŠç¥ã玹ä»ããŸãïŒ
1. ãããŠã³ã¹ãšã¹ããããªã³ã°
æ€çŽ¢å ¥åãªã©ãé »ç¹ã«å€æŽãããå€ãæ±ãå ŽåããããŠã³ã¹ãšã¹ããããªã³ã°ã¯éå°ãªAPIåŒã³åºããé²ãããšãã§ããŸãããããŠã³ã¹ã¯ã颿°ãç¹å®ã®é å»¶åŸã«ã®ã¿åŒã³åºãããããšãä¿èšŒããã¹ããããªã³ã°ã¯ã颿°ãåŒã³åºãããé »åºŠãå¶éããŸãã
äŸïŒæ€çŽ¢å ¥åã®ãããŠã³ã¹```javascript import React, { useState, useEffect } from 'react'; import useFetch from './useFetch'; function SearchComponent() { const [searchTerm, setSearchTerm] = useState(''); const [debouncedSearchTerm, setDebouncedSearchTerm] = useState(''); useEffect(() => { const timerId = setTimeout(() => { setDebouncedSearchTerm(searchTerm); }, 500); // 500msã®é å»¶ return () => { clearTimeout(timerId); }; }, [searchTerm]); const { data: results, loading, error } = useFetch(`https://api.example.com/search?q=${debouncedSearchTerm}`); const handleInputChange = (event) => { setSearchTerm(event.target.value); }; return (
èªã¿èŸŒã¿äž...
} {error &&ãšã©ãŒ: {error.message}
} {results && (-
{results.map((result) => (
- {result.title} ))}
ãã®äŸã§ã¯ãdebouncedSearchTermã¯ãŠãŒã¶ãŒã500msã¿ã€ãã³ã°ã忢ããåŸã«ã®ã¿æŽæ°ãããããŒã¹ãããŒã¯ããšã®äžèŠãªAPIåŒã³åºããé²ããŸããããã«ãããããã©ãŒãã³ã¹ãåäžãããµãŒããŒã®è² è·ã軜æžãããŸãã
2. ãã£ãã·ã³ã°
ååŸããããŒã¿ããã£ãã·ã¥ãããšãAPIåŒã³åºãã®æ°ãå€§å¹ ã«æžããããšãã§ããŸãããã£ãã·ã¥ã¯ããŸããŸãªã¬ãã«ã§å®è£ ã§ããŸãïŒ
- ãã©ãŠã¶ãã£ãã·ã¥ïŒ é©åãªHTTPãã£ãã·ã¥ããããŒã䜿çšããããã«APIãèšå®ããŸãã
- ã€ã³ã¡ã¢ãªãã£ãã·ã¥ïŒ ã¢ããªã±ãŒã·ã§ã³å ã§ååŸããããŒã¿ãä¿åããããã«ãåçŽãªãªããžã§ã¯ãã䜿çšããŸãã
- æ°žç¶ã¹ãã¬ãŒãžïŒ é·æçãªãã£ãã·ã³ã°ã®ããã«
localStorageãŸãã¯sessionStorageã䜿çšããŸãã
äŸïŒuseFetchã§ã®åçŽãªã€ã³ã¡ã¢ãªãã£ãã·ã¥ã®å®è£
```javascript // useFetch.js (倿ŽåŸ) import { useState, useEffect } from 'react'; const cache = {}; function useFetch(url) { const [data, setData] = useState(null); const [loading, setLoading] = useState(true); const [error, setError] = useState(null); useEffect(() => { const fetchData = async () => { setLoading(true); setError(null); if (cache[url]) { setData(cache[url]); setLoading(false); return; } try { const response = await fetch(url); if (!response.ok) { throw new Error(`HTTPãšã©ãŒïŒã¹ããŒã¿ã¹: ${response.status}`); } const jsonData = await response.json(); cache[url] = jsonData; setData(jsonData); } catch (error) { setError(error); } finally { setLoading(false); } }; fetchData(); }, [url]); return { data, loading, error }; } export default useFetch; ```
ãã®äŸã§ã¯ãåçŽãªã€ã³ã¡ã¢ãªãã£ãã·ã¥ã远å ããŠããŸããç¹å®ã®URLã®ããŒã¿ããã§ã«ãã£ãã·ã¥ã«ããå Žåãæ°ããAPIåŒã³åºããè¡ã代ããã«ããã£ãã·ã¥ããçŽæ¥ååŸãããŸããããã«ãããé »ç¹ã«ã¢ã¯ã»ã¹ãããããŒã¿ã®ããã©ãŒãã³ã¹ãåçã«åäžããŸãã
3. ã¡ã¢å
Reactã®useMemoããã¯ã¯ãååŸããããŒã¿ã«äŸåããé«ã³ã¹ããªèšç®ãã¡ã¢åããããã«äœ¿çšã§ããŸããããã«ãããããŒã¿ã倿ŽãããŠããªãå Žåã®äžèŠãªåã¬ã³ããªã³ã°ãé²ããŸãã
äŸïŒæŽŸçå€ã®ã¡ã¢å
```javascript import React, { useMemo } from 'react'; import useFetch from './useFetch'; function UserProfile({ userId }) { const { data: user, loading, error } = useFetch(`https://api.example.com/users/${userId}`); const formattedName = useMemo(() => { if (!user) return ''; return `${user.firstName} ${user.lastName}`; }, [user]); if (loading) { return
ãŠãŒã¶ãŒããŒã¿ãèªã¿èŸŒã¿äž...
; } if (error) { returnãšã©ãŒ: {error.message}
; } if (!user) { returnå©çšå¯èœãªãŠãŒã¶ãŒããŒã¿ããããŸããã
; } return ({formattedName}
ã¡ãŒã«: {user.email}
å Žæ: {user.location}
ãã®äŸã§ã¯ãformattedNameã¯userãªããžã§ã¯ãã倿Žããããšãã«ã®ã¿åèšç®ãããŸããuserãªããžã§ã¯ããåããŸãŸã§ããã°ãã¡ã¢åãããå€ãè¿ãããäžèŠãªèšç®ãšåã¬ã³ããªã³ã°ãé²ããŸãã
4. ã³ãŒãåå²
ã³ãŒãåå²ã䜿çšãããšãã¢ããªã±ãŒã·ã§ã³ãããå°ããªãã£ã³ã¯ã«åå²ãããªã³ããã³ãã§èªã¿èŸŒãããšãã§ããŸããããã«ãããç¹ã«å€ãã®äŸåé¢ä¿ãæã€å€§èŠæš¡ãªã¢ããªã±ãŒã·ã§ã³ã®åæèªã¿èŸŒã¿æéãæ¹åã§ããŸãã
äŸïŒã³ã³ããŒãã³ãã®é å»¶èªã¿èŸŒã¿
```javascript
import React, { lazy, Suspense } from 'react';
const UserProfile = lazy(() => import('./UserProfile'));
function App() {
return (
ãã®äŸã§ã¯ãUserProfileã³ã³ããŒãã³ãã¯å¿
èŠãªãšãã«ã®ã¿èªã¿èŸŒãŸããŸããSuspenseã³ã³ããŒãã³ãã¯ãã³ã³ããŒãã³ããèªã¿èŸŒãŸããŠããéã«ãã©ãŒã«ããã¯UIãæäŸããŸãã
ç«¶åç¶æ ã®åŠç
åãuseEffectããã¯ã§è€æ°ã®éåææäœãéå§ããããšãç«¶åç¶æ
ãçºçããå¯èœæ§ããããŸãããã¹ãŠã®æäœãå®äºããåã«ã³ã³ããŒãã³ããã¢ã³ããŠã³ãããããšããšã©ãŒãäºæããªãåäœãçºçããå¯èœæ§ããããŸããã³ã³ããŒãã³ããã¢ã³ããŠã³ãããããšãã«ããããã®æäœãã¯ãªãŒã³ã¢ããããããšãéèŠã§ãã
äŸïŒã¯ãªãŒã³ã¢ãã颿°ã«ããç«¶åç¶æ ã®é²æ¢
```javascript import React, { useState, useEffect } from 'react'; function UserProfile({ userId }) { const [user, setUser] = useState(null); const [loading, setLoading] = useState(true); const [error, setError] = useState(null); useEffect(() => { let isMounted = true; // ã³ã³ããŒãã³ãã®ããŠã³ãç¶æ ã远跡ãããã©ã°ã远å const fetchData = async () => { setLoading(true); setError(null); try { const response = await fetch(`https://api.example.com/users/${userId}`); if (!response.ok) { throw new Error(`HTTPãšã©ãŒïŒã¹ããŒã¿ã¹: ${response.status}`); } const data = await response.json(); if (isMounted) { // ã³ã³ããŒãã³ãããŸã ããŠã³ããããŠããå Žåã®ã¿stateãæŽæ° setUser(data); } } catch (error) { if (isMounted) { // ã³ã³ããŒãã³ãããŸã ããŠã³ããããŠããå Žåã®ã¿stateãæŽæ° setError(error); } } finally { if (isMounted) { // ã³ã³ããŒãã³ãããŸã ããŠã³ããããŠããå Žåã®ã¿stateãæŽæ° setLoading(false); } } }; fetchData(); return () => { isMounted = false; // ã³ã³ããŒãã³ããã¢ã³ããŠã³ãããããšãã«ãã©ã°ãfalseã«èšå® }; }, [userId]); if (loading) { return
ãŠãŒã¶ãŒããŒã¿ãèªã¿èŸŒã¿äž...
; } if (error) { returnãšã©ãŒ: {error.message}
; } if (!user) { returnå©çšå¯èœãªãŠãŒã¶ãŒããŒã¿ããããŸããã
; } return ({user.name}
ã¡ãŒã«: {user.email}
å Žæ: {user.location}
ãã®äŸã§ã¯ãisMountedãšãããã©ã°ã䜿çšããŠãã³ã³ããŒãã³ãããŸã ããŠã³ããããŠãããã©ããã远跡ããŸããstateã¯ãã³ã³ããŒãã³ãããŸã ããŠã³ããããŠããå Žåã«ã®ã¿æŽæ°ãããŸããã¯ãªãŒã³ã¢ãã颿°ã¯ãã³ã³ããŒãã³ããã¢ã³ããŠã³ãããããšãã«ãã©ã°ãfalseã«èšå®ããç«¶åç¶æ
ãšã¡ã¢ãªãªãŒã¯ãé²ããŸããå¥ã®ã¢ãããŒããšããŠãç¹ã«å€§ããªããŠã³ããŒããé·æéå®è¡ãããæäœã§ã¯ã`AbortController` APIã䜿çšããŠãã§ãããªã¯ãšã¹ãããã£ã³ã»ã«ããããšãéèŠã§ãã
éåæãªãœãŒã¹æ¶è²»ã«é¢ããã°ããŒãã«ãªèæ ®äºé
ã°ããŒãã«ãªãªãŒãã£ãšã³ã¹åãã«Reactã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ããå Žåã以äžã®èŠçŽ ãèæ ®ããŠãã ããïŒ
- ãããã¯ãŒã¯é å»¶ïŒ äžçã®ããŸããŸãªå°åã®ãŠãŒã¶ãŒã¯ããããã¯ãŒã¯é å»¶ãç°ãªãå ŽåããããŸããAPIãšã³ããã€ã³ããé«éåãããã£ãã·ã³ã°ãã³ãŒãåå²ãªã©ã®æè¡ã䜿çšããŠãé å»¶ã®åœ±é¿ãæå°éã«æããŸããCDNïŒã³ã³ãã³ãããªããªãŒãããã¯ãŒã¯ïŒã䜿çšããŠããŠãŒã¶ãŒã«è¿ããµãŒããŒããéçã¢ã»ãããé ä¿¡ããããšãæ€èšããŠãã ãããäŸãã°ãAPIãç±³åœã§ãã¹ããããŠããå Žåãã¢ãžã¢ã®ãŠãŒã¶ãŒã¯å€§å¹ ãªé å»¶ãçµéšããå¯èœæ§ããããŸããCDNã¯APIã¬ã¹ãã³ã¹ãããŸããŸãªå Žæã«ãã£ãã·ã¥ããããŒã¿ãç§»åããå¿ èŠã®ããè·é¢ãççž®ã§ããŸãã
- ããŒã¿ã®ããŒã«ã©ã€ãºïŒ ãŠãŒã¶ãŒã®å Žæã«åºã¥ããŠãæ¥ä»ãéè²šãæ°å€ãªã©ã®ããŒã¿ãããŒã«ã©ã€ãºããå¿
èŠæ§ãèæ
®ããŠãã ããã
react-intlã®ãããªåœéåïŒi18nïŒã©ã€ãã©ãªã䜿çšããŠãããŒã¿ãã©ãŒããããåŠçããŸãã - ã¢ã¯ã»ã·ããªãã£ïŒ ã¢ããªã±ãŒã·ã§ã³ãé害ãæã€ãŠãŒã¶ãŒã«ãã¢ã¯ã»ã¹å¯èœã§ããããšã確èªããŠãã ãããARIA屿§ã䜿çšããã¢ã¯ã»ã·ããªãã£ã®ãã¹ããã©ã¯ãã£ã¹ã«åŸã£ãŠãã ãããäŸãã°ãç»åã«ä»£æ¿ããã¹ããæäŸããã¢ããªã±ãŒã·ã§ã³ãããŒããŒãã§æäœå¯èœã§ããããšã確èªããŸãã
- ã¿ã€ã ãŸãŒã³ïŒ æ¥ä»ãšæå»ã衚瀺ããéã«ã¯ãã¿ã€ã ãŸãŒã³ã«æ³šæããŠãã ããã
moment-timezoneã®ãããªã©ã€ãã©ãªã䜿çšããŠãã¿ã€ã ãŸãŒã³å€æãåŠçããŸããäŸãã°ãã¢ããªã±ãŒã·ã§ã³ãã€ãã³ãã®æå»ã衚瀺ããå ŽåããããããŠãŒã¶ãŒã®ããŒã«ã«ã¿ã€ã ãŸãŒã³ã«å€æããããã«ããŠãã ããã - æåçãªé æ ®ïŒ ããŒã¿ã衚瀺ãããããŠãŒã¶ãŒã€ã³ã¿ãŒãã§ãŒã¹ãèšèšãããããéã«ã¯ãæåçãªéãã«æ³šæããŠãã ãããç¹å®ã®æåã§äžå¿«ã«æãããå¯èœæ§ã®ããç»åãèšå·ã®äœ¿çšã¯é¿ããŠãã ãããã¢ããªã±ãŒã·ã§ã³ãæåçã«é©åã§ããããšã確èªããããã«ãçŸå°ã®å°éå®¶ã«çžè«ããŠãã ããã
çµè«
Reactã®ããã¯ã䜿çšããŠéåæãªãœãŒã¹æ¶è²»ããã¹ã¿ãŒããããšã¯ãå
ç¢ã§ããã©ãŒãã³ã¹ã®é«ãã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ããããã«äžå¯æ¬ ã§ããuseEffectãšuseStateã®åºæ¬ãçè§£ããåå©çšæ§ã®ããã«ã«ã¹ã¿ã ããã¯ãäœæãããããŠã³ã¹ããã£ãã·ã³ã°ãã¡ã¢åãªã©ã®æè¡ã§ããã©ãŒãã³ã¹ãæé©åããç«¶åç¶æ
ãåŠçããããšã§ãäžçäžã®ãŠãŒã¶ãŒã«çŽ æŽããããŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ãæäŸããã¢ããªã±ãŒã·ã§ã³ãäœæã§ããŸããã°ããŒãã«ãªãªãŒãã£ãšã³ã¹åãã®ã¢ããªã±ãŒã·ã§ã³ãéçºããéã«ã¯ããããã¯ãŒã¯é
å»¶ãããŒã¿ã®ããŒã«ã©ã€ãºãæåçãªé
æ
®ãšãã£ãã°ããŒãã«ãªèŠçŽ ãåžžã«èæ
®ããããšãå¿ããªãã§ãã ããã